
package com.liuym.common.redis;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis操作类
 */
public class RedisTemplateManager {
    private RedisTemplate<String, String> redisTemplate;

    public RedisTemplateManager(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    // 永久保存
    public void setKey(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 过期时间多少秒 TTL 设计, expire 单位默认为秒
    public void setKey(String key, String value, long expire) {
        redisTemplate.opsForValue().set(key, value, expire, TimeUnit.SECONDS);
    }

    // 如果key存在返回false；如果key不存在，就存入reidis返回true
    public boolean setIfAbsent(String key, String value) {
        return redisTemplate.opsForValue().setIfAbsent(key, value);
    }

    // 根据一个key查询value
    public String getValue(String key) {
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        return ops.get(key);
    }

    //如果有key有值就返回值，返回给定key的旧值。 当key没有旧值时，即key不存在时，返回nil。当key存在但不是字符串类型时，返回一个错误。
    public String getAndSet(String key, String value) {
        return redisTemplate.opsForValue().getAndSet(key, value);
    }

    // 清理redis中的key； true为成功，false为删除失败
    public boolean delKey(String key) {
        return redisTemplate.delete(key);
    }

    // 设置超时；默认单位为秒
    public boolean expire(final String key, long expire) {
        return redisTemplate.expire(key, expire, TimeUnit.SECONDS);
    }

    // key incr by delta (增加的步长)
    public Long incr(final String key, long delta) {
        return redisTemplate.opsForValue().increment(key, delta);
    }

    /**
     * hash 队列常见操作
     */
    // hash队列写值key：hash队列名， hashKey:存放的key, hashvalue:存放的value
    public void hashPut(String cluster, String key, String hashKey, String hashvalue) {
        redisTemplate.opsForHash().put(key, hashKey, hashvalue);
    }

    // 获取指定redis集群中 具体hash的所有values
    public List<Object> getHashValues(String key) {
        return redisTemplate.opsForHash().values(key);
    }

    // 获取指定redis集群中 具体hash的所有key-values
    public Map<Object, Object> getHashKeyValues(String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // 查询hash容器中是否含有指定的hashKey
    public Object getHashKey(String key, Object hashKey) {
        return redisTemplate.opsForHash().get(key, hashKey);
    }

    // 获取hash队列长度
    public Long getHashSize(String key) {
        return redisTemplate.opsForHash().size(key);
    }

    // 往hash队列写 map 
    public void pushAllHash(String key, Map<String, String> map) {
        redisTemplate.opsForHash().putAll(key, map);
    }

    // 删除hash中的values(可以删除单个，也可以阐述一个数组[key集合]的数据)
    public void deleteHash(String key, String... hashKeys) {
        redisTemplate.opsForHash().delete(key, hashKeys);
    }

    /**
     * list 队列常见操作
     */
    //   获取集合指定位置的值
    public void indexList(String key, long index) {
        redisTemplate.opsForList().index(key, index);
    }

    //  以集合的方式向左边批量添加元素
    public void leftPushAllToList(String key, List<String> list) {
        redisTemplate.opsForList().leftPushAll(key, list);
    }

    //  以集合的方式向右边批量添加元素
    public void rightPushAllToList(String key, List<String> list) {
        redisTemplate.opsForList().rightPushAll(key, list);
    }

    // 读取集合所有元素
    public List<String> listRange(String key) {
        return redisTemplate.opsForList().range(key, 0, -1);
    }

    // 获取集合长度
    public Long listSize(String key) {
        return redisTemplate.opsForList().size(key);
    }

    //  移除集合中的左边第一个元素
    public String leftPopList(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    //  移除集合中的左边第一个元素
    public String rightPopList(String key) {
        return redisTemplate.opsForList().rightPop(key);
    }

    /**
     * set 操作
     */
    // 向变量中批量添加值
    public Long addToSet(String key, String... values) {
        return redisTemplate.opsForSet().add(key, values);
    }

    // 获取set长度
    public long setSize(String key) {
        return redisTemplate.opsForSet().size(key);
    }

    // 获取set中的所有元素
    public Set<String> setMembers(String key) {
        return redisTemplate.opsForSet().members(key);
    }

    //  * @return {@literal null} when used in pipeline / transaction.
    // * @see <a href="http://redis.io/commands/srem">Redis Documentation: SREM</a>
    public Long setRemove(String key, String... values) {
        return redisTemplate.opsForSet().remove(key, values);
    }
}
